package com.jy.oms.framework.asyn.task.annotation;

import com.jy.oms.framework.asyn.task.constants.TaskQueueTypeEnum;
import org.springframework.stereotype.Service;

import java.lang.annotation.*;

/**
 * 任务
 *
 * @author liuquan
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface Task {

    /**
     * 任务编码，全局唯一
     */
    String taskCode();

    /**
     * 任务队列
     */
    TaskQueueTypeEnum taskQueue() default TaskQueueTypeEnum.DB;

    /**
     * 失败重试次数； 最大重试次数不能超过5次；
     */
    int retryNum() default 0;

    /**
     * 是否连续重试； true连续重试，失败情况下在当前线程一直重试；
     *
     * @return
     */
    boolean retryContinuous() default false;

    /**
     * 是否支持重试退避； true支持，false不支持
     * 如：重试间隔1秒，重试3次时，每次重试间隔时间依次为1秒、2秒、3秒，即 重试次数 * 重试间隔
     */
    boolean retryBackoff() default false;

    /**
     * 重试间隔时间，默认60秒
     */
    int retryIntervalSeconds() default 60;

    /**
     * 回调方法，当注解作用在方法上时才生效;
     * 回调方法必须是两个参数，分别为任务执行方法的参数和返回值类型
     */
    String callback() default "";

    /**
     * 直接调用执行任务时，是否保存任务异步执行
     */
    boolean saveAndAsyncExecuteWhenDirectCall() default false;

    /**
     * 异常发生且任务支持重试时，是否允许修改任务参数 便于 下一次执行使用;
     * 适用于DB队列任务，redis会自动更新任务参数
     */
    boolean updateTaskParamWhenException() default false;

    /**
     * 根据任务编码+任务参数保证任务唯一性，即相同的任务参数只会存在一条任务
     */
    boolean keepUniqueTaskAccordParam() default false;
}
